//
//  ALHomeTableViewController.swift
//  Swift01
//
//  Created by Miaoyang on 16/4/10.
//  Copyright © 2016年 Miaoyang. All rights reserved.
//

import UIKit

import SVProgressHUD
import SVPullToRefresh

/*
 导航栏显示什么内容不是看导航控制器,看导航控制器当前正在显示的子控制器
 */
class ALHomeTableViewController: ALBaseViewController {
    
    /// 刷新控件
    private lazy var pullDownRefreshControl: ALPullDownRefreshControl = ALPullDownRefreshControl()
    
    /// 微博模型
    var statuses: [ALStatus]? {
        didSet {
            // 只要微博数据改变了就刷新微博数据
            ALPrint("总得微薄数据: \(statuses?.count)")
            self.tableView.reloadData()
        }
    }
    
    private let ReuseIdentifier = "ReuseIdentifier"
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 用户没有登录不需要做一下操作
        if !ALUserAccountViewModel.sharedInstance.userLogin {
            ALPrint("没有登录不做一下操作")
            return
        }
        
        setupNavigationBar()
        prepareTableView()
    }
    
    private func prepareTableView() {
        // 去掉分割线
        tableView.separatorStyle = UITableViewCellSeparatorStyle.None
        // 注册cell
        tableView.registerClass(ALStatusCell.self, forCellReuseIdentifier: ReuseIdentifier)
        
        // 1.cell的高度设置为UITableViewAutomaticDimension
        tableView.rowHeight = UITableViewAutomaticDimension
        
        // 2.预估行高,等cell要显示的时候才回去计算真实的高度
        tableView.estimatedRowHeight = 200
        
        
        // MARK: - 下拉刷新相关
        // 将刷新控件添加到tableView里面
        tableView.addSubview(pullDownRefreshControl)
        
        // 03.准备刷新的闭包
        pullDownRefreshControl.pullDownRefreshHandler = { () -> () in
            ALPrint("控制器开始下拉刷新")
            
            self.loadNewStatus()
        }
        
        // 让控件进入到刷新状态
        pullDownRefreshControl.startRefreshing()
        // MARK: - 下拉刷新相关结束
        
        // 上拉加载更多
        tableView.addInfiniteScrollingWithActionHandler { () -> Void in
            // 上拉加载数据
            
            ALPrint("上拉加载数据")
            self.loadMoreStatus()
        }
    }
    
    /// 上拉加载更多老的数据
    private func loadMoreStatus() {
        // 获取id最小的微博
        let max_id = self.statuses?.last?.id ?? 0
        
        // 一条微博数据都没有,就不去上拉加载更多数据
        if max_id == 0 {
            ALPrint("没有微博数据,不去上拉加载更多数据")
            return
        }
        
        // 加载比 max_id 还小得微博
        ALStatusViewModel.sharedInstance.loadStatus(0, max_id: max_id) { (statuses, error) -> () in
            // 让刷新控件结束刷新
            self.tableView.infiniteScrollingView.stopAnimating()
            
            if error != nil {
                ALPrint("上拉加载更多微博数据失败了: \(error)")
                return
            }
            
            let count = statuses?.count ?? 0
            
            ALPrint("加载更多的数据条数: \(count)")
            
            if count == 0 {
                // 没有加载更多的数据了
                ALPrint("没有加载更多的数据了")
                SVProgressHUD.showErrorWithStatus("没有加载更多的数据了")
                return
            }
            
            // 拼接数据,老得微博数据拼接到现有数据的后面
            let s = self.statuses! + statuses!
            self.statuses = s
        }
    }
    
    /// 下拉加载新的微薄数据
    private func loadNewStatus() {
        // 获取ID最大的微博, 第一条微博就是ID最大的微博, 当第一次进入刷新,一条微博都没有id = 0, 加载最新20条
        let since_id = self.statuses?.first?.id ?? 0
        
        // 01.加载数据,准备了闭包,传递给了 loadStatus 的 loadStatusCallback
        ALStatusViewModel.sharedInstance.loadStatus(since_id, max_id: 0) { (statuses, error) -> () in
            // 加载数据完成了.让刷新控件完成刷新
            self.pullDownRefreshControl.endRefreshing()
            
            if error != nil {
                ALPrint("获取微博数据失败了: \(error)")
                SVProgressHUD.showErrorWithStatus("您的网络不给力...")
                return
            }
            
            // 判断返回微博的数量
            let count = statuses?.count ?? 0
            ALPrint("加载了微薄数据: \(count)")
            //如果是第一次加载20条,不需要显示
            if since_id != 0 {
                //用户手动拖拽,显示下拉刷新的条数
                self.showTipLabel(count)
            }
            
            if count == 0 {
                ALPrint("没有加载到微博数据")
                
                if since_id == 0 {
                    SVProgressHUD.showErrorWithStatus("没有加载到微博数据")
                }
                return
            }
            
            
            // 加载微博成功,将微博数据保存起来,让tableView去显示
            // 判断,如果 since_id = 0
            if since_id == 0 {
                self.statuses = statuses
            } else {
                // 如果since_id != 0, 将返回的数据拼接到现有数据前面
                // 数组直接使用加号拼接
                let s = statuses! + self.statuses!
                
                // 将拼接好的数据赋值给self.statuses
                self.statuses = s
            }
        }
    }
    
    //显示下拉数据提示
    private func showTipLabel(count:Int){
        let label = UILabel(fontSize: 14,textColor: UIColor.whiteColor())
        let TipLabelHeight :CGFloat = 44
        label.backgroundColor = UIColor.orangeColor()
        label.textAlignment = NSTextAlignment.Center
       
        //将Label放入导航栏
        let y = -(UIApplication.sharedApplication().statusBarFrame.height + TipLabelHeight)
        label.frame = CGRect(x: 0, y: y, width:  UIScreen.mainScreen().bounds.size.width, height: TipLabelHeight)
        //设置文本内容
        label.text = count == 0 ? "没有新的微博数据" : "下拉刷新了 \(count) 条微博数据"
        //添加到导航栏上
        navigationController?.navigationBar.insertSubview(label, atIndex: 0)
        //label动画
        UIView.animateWithDuration(1, animations: { () -> Void in
            // UIView动画,反过来执行
            //            UIView.setAnimationRepeatAutoreverses(true)
            // UIView动画重复执行
            //            UIView.setAnimationRepeatCount(5)
            
            label.frame = CGRect(x: 0, y: TipLabelHeight, width: UIScreen.mainScreen().bounds.width, height: TipLabelHeight)
        }) { (_) -> Void in
            // 停一会,在动画到屏幕上面去
            // 返回回去的动画
            UIView.animateWithDuration(1, delay: 0.5, options: [], animations: { () -> Void in
                label.frame = CGRect(x: 0, y: -(UIApplication.sharedApplication().statusBarFrame.height + TipLabelHeight), width: UIScreen.mainScreen().bounds.width, height: TipLabelHeight)
                }, completion: { (_) -> Void in
                    ALPrint("动画完成了")
                    label.removeFromSuperview()
            })
        }
    
    }
    
    private func setupNavigationBar() {
        // 左边
        navigationItem.leftBarButtonItem = UIBarButtonItem(imageName: "navigationbar_friendsearch", target: self, action: #selector(ALHomeTableViewController.didClickPerson(_:)))
        
        // 右边
        navigationItem.rightBarButtonItem = UIBarButtonItem(imageName: "navigationbar_pop", target: self, action: #selector(ALHomeTableViewController.didClickQRCode(_:)))
        
        // ?? 前面如果为nil 就使用 ?? 后面的内容
        // ?? 前面有值,直接使用前面的值
        let name = ALUserAccountViewModel.sharedInstance.userAccount?.screen_name ?? "没有名称"
        
        // title按钮
        let titleButton = ALHomeTileButton(title: name)
        titleButton.addTarget(self, action: #selector(ALHomeTableViewController.didClickTitleButton(_:)), forControlEvents: UIControlEvents.TouchUpInside)
        navigationItem.titleView = titleButton
    }
    
    // MARK: - 按钮点击事件
    @objc private func didClickTitleButton(button: UIButton) {
        // 切换按钮的选中状态
        button.selected = !button.selected
        UIView.animateWithDuration(ALDefautlAnimDuration) { () -> Void in
            button.imageView?.transform = button.selected ? CGAffineTransformMakeRotation(CGFloat(M_PI - 0.001)) : CGAffineTransformIdentity
        }
    }
    
    @objc private func didClickPerson(button: UIButton) {
        ALPrint("button: \(button)")
    }
    
    @objc private func didClickQRCode(button: UIButton) {
        ALPrint("button: \(button)")
    }
}

// MARK: - 扩展 HMHomeTableViewController,将tableView的数据源方法放到这里
extension ALHomeTableViewController {
    
    // 返回cell的数量
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.statuses?.count ?? 0
    }
    
    // 返回每个cell的内容
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier(ReuseIdentifier, forIndexPath:
            indexPath) as! ALStatusCell
        
        // cell显示之前,将模型传递给cell
        cell.status = self.statuses?[indexPath.row]
        
        return cell
    }
    
    /// cell不要高亮
    override func tableView(tableView: UITableView, shouldHighlightRowAtIndexPath indexPath: NSIndexPath) -> Bool {
        return false
    }

}
